﻿using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using System.Collections.Generic;

namespace AsTekMobile
{
    public partial class frmSevk : Form
    {
        DataTable Lines = new DataTable();
        public EvrakTipleri EvrakTipi { get; set; }
        User usr = Database.ctor.Kullanicilar.Where(x => x.ID == Cevir.Parse<int>(Program.Session[Settings.TeknikServisID])).FirstOrDefault();
        public CariBilgi Cari { get; set; }
        public string AracKodu { get; set; }
        public int ServisID { get; set; }

        public frmSevk()
        {
            InitializeComponent();
            this.Load += new EventHandler(frmSevk_Load);
        }

        void frmSevk_Load(object sender, EventArgs e)
        {
            try
            {
                Lines.Columns.Add("Stok Adı", typeof(string));
                Lines.Columns.Add("Miktar", typeof(string));
                Lines.Columns.Add("Data", typeof(HareketBilgileri));

                switch (EvrakTipi)
                {
                    case EvrakTipleri.DepoSevkGiris:
                        this.Text = "Araç Yükleme";
                        break;
                    case EvrakTipleri.DepoSevkCikis:
                        this.Text = "Araç Boşaltma";
                        break;
                    case EvrakTipleri.ToptanSatisIrsaliyesi:
                        this.Text = "Satış İşlemi";
                        break;
                }

                if (EvrakTipi != EvrakTipleri.ToptanSatisIrsaliyesi)
                {
                    List<Depo> _depolar = new List<Depo>();
                    foreach (var item in Database.ctor.Depolar)
                    {
                        if (item.No != usr.DepoNo && usr.KullanilabilirDepolar.Split(';').Contains(item.No.ToString()))
                        {
                            _depolar.Add(item);
                        }
                    }
                    cmbDepo.DataSource = _depolar;
                    cmbDepo.DisplayMember = "Adi";
                }
                else
                {
                    label1.Visible = false;
                    cmbDepo.Visible = false;
                }


                grdEklenenler.VeriKaynagi = Lines;
                grdEklenenler.Columns[2].Visible = false;
            }
            catch (Exception ex)
            {
                ErrorMgr.Opps(ex);
            }
        }

        private void btnKapat_Click(object sender, EventArgs e)
        {
            if (grdEklenenler.RowCount > 0)
            {
                DialogResult dlg = MessageBox.Show("Kaydetmek istermisiniz !", "Dikkat", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
                if (dlg == DialogResult.Yes)
                {
                    try
                    {
                        EvrakKayit();
                    }
                    catch (Exception ex)
                    {
                        ErrorMgr.Opps(ex);
                    }
                }
            }
            this.Close();
        }

        private void EvrakKayit()
        {
            if (this.EvrakTipi == EvrakTipleri.ToptanSatisIrsaliyesi)
            {
                SatisIrsaliyeKaydet();
            }
            else
            {
                Evrak evr = new Evrak();
                evr.DbNo = usr.DbNo;
                evr.BelgeNo = "";
                evr.CariKodu = "";
                if (EvrakTipi == EvrakTipleri.DepoSevkCikis)
                {
                    Depo dp = (Depo)cmbDepo.SelectedItem;
                    evr.GirisDepoNo = dp.No;
                    evr.CikisDepoNo = usr.DepoNo;
                }
                else
                {
                    Depo dp = (Depo)cmbDepo.SelectedItem;
                    evr.CikisDepoNo = dp.No;
                    evr.GirisDepoNo = usr.DepoNo;
                }
                evr.EvrakCinsi = this.EvrakTipi;
                evr.FirmaNo = 0;
                evr.MikroKullanici = usr.MikroKullanici;
                evr.PlasiyerKodu = usr.Plasiyer;
                evr.Seri = usr.EvrakSeri;
                evr.Sira = 1;
                evr.SrmMerkezKodu = usr.SrmMerkezi;
                evr.SubeNo = 0;
                evr.Tarih = DateTime.Now;
                evr.AracKodu = "";

                for (int i = 0; i < Lines.Rows.Count; i++)
                {
                    HareketBilgileri hr = (HareketBilgileri)Lines.Rows[i][2];
                    evr.Rows.Add(hr);
                }
                bool result = Database.ctor.SaveEvrak(evr);
                if (result == false)
                {
                    MessageBox.Show("Kaydedilemedi !");
                }
            }
        }

        private void SatisIrsaliyeKaydet()
        {
            User usr = Database.ctor.Kullanicilar.Where(x => x.ID == Cevir.Parse<int>(Program.Session[Settings.TeknikServisID])).FirstOrDefault();
            decimal kdvDahil = 0;
            decimal kdvHaric = 0;

            for (int i = 0; i < Lines.Rows.Count; i++)
            {
                HareketBilgileri hr = (HareketBilgileri)Lines.Rows[i][2];
                kdvHaric += hr.Fiyat * hr.Miktar;
                kdvDahil += (hr.Fiyat * hr.Miktar) * ((100m + hr.KdvOrani) / 100m);
            }

            frmBelgeNo frm = new frmBelgeNo();
            frm.EvrakCinsi = EvrakTipleri.ToptanSatisFaturasi;
            frm.Cari = this.Cari;
            frm.KdvDahilTutar = kdvDahil.ToString("n2");
            frm.KdvHaricTutar = kdvHaric.ToString("n2");

            if (frm.ShowDialog() == DialogResult.OK)
            {
                #region Satış İrsaliyesi
                Evrak evr = new Evrak();
                evr.DbNo = usr.DbNo;
                evr.ServisID = ServisID;
                evr.EvrakSeriGirildi = true;
                evr.BelgeNo = frm.EvrakBelgeNo;
                evr.CariKodu = Cari.CariKodu;
                evr.CikisDepoNo = usr.ArizaliDepoNo;
                evr.EvrakCinsi = EvrakTipleri.ToptanSatisFaturasi;
                evr.FirmaNo = Cevir.Parse<int>(usr.FirmaNo);
                evr.GirisDepoNo = usr.ArizaliDepoNo;
                evr.MikroKullanici = usr.MikroKullanici;
                evr.PlasiyerKodu = usr.Plasiyer;
                evr.Seri = frm.EvrakSeri;
                evr.Sira = frm.EvrakSira;
                evr.SrmMerkezKodu = usr.SrmMerkezi;
                evr.SubeNo = Cevir.Parse<int>(usr.SubeNo);
                evr.Tarih = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
                evr.AracKodu = AracKodu;

                for (int i = 0; i < Lines.Rows.Count; i++)
                {
                    HareketBilgileri hr = (HareketBilgileri)Lines.Rows[i][2];
                    if (hr != null)
                    {
                        HareketBilgileri satilan = new HareketBilgileri();
                        satilan.Barkod = "";
                        satilan.BurutTutar = hr.Fiyat * hr.Miktar;
                        satilan.Fiyat = hr.Fiyat;
                        satilan.Miktar = hr.Miktar;
                        satilan.Satir = i;
                        satilan.KdvSira = hr.KdvSira;
                        satilan.KdvOrani = hr.KdvOrani;
                        satilan.KdvTutari = (hr.BurutTutar - (hr.BurutTutar / ((100m + hr.KdvOrani) / 100m)));
                        satilan.SeriNolar = hr.SeriNolar;
                        satilan.SipDbcNo = 0;
                        satilan.SipRecNo = 0;
                        satilan.StokAdi = hr.StokAdi;
                        satilan.StokKodu = hr.StokKodu;
                        evr.Rows.Add(satilan);
                    }
                }

                bool result = Database.ctor.SaveEvrak(evr);
                if (result == false)
                {
                    MessageBox.Show("Kaydedilemedi ! tekrar deneyiniz !");
                }
                else
                {
                    DialogResult rs = MessageBox.Show("Evrak kaydedildi ! yazdırmak istermisiniz ?", "Uyarı", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    if (rs == DialogResult.Yes)
                    {
                        frmListe liste = new frmListe();
                        liste.ServisID = ServisID;
                        liste.Show();
                    }
                    this.Close();
                }
                #endregion
            }

        }

        private void btnAra_Click(object sender, EventArgs e)
        {
            try
            {
                grdListe.VeriKaynagi = Database.ctor.Stoklar.Where(x => x.Kodu.Like(txtKod.Text) || x.Adi.Like(txtKod.Text)).ToList();
                grdListe.Columns[0].Visible = false;
                grdListe.Columns[1].Text = "Stok Kodu";
                grdListe.Columns[2].Text = "Stok Adı";
                grdListe.Columns[3].Text = "Fiyat";
                grdListe.Columns[4].Text = "Döviz Cinsi";
                grdListe.Columns[5].Visible = false;
                grdListe.Columns[6].Visible = false;
                tabControl1.SelectedIndex = 1;
            }
            catch (Exception ex)
            {
                ErrorMgr.Opps(ex);
            }
        }

        private void grdListe_DoubleClick(object sender, EventArgs e)
        {
            try
            {
                if (grdListe.CurrentRowIndex > -1)
                {
                    Stok stk = grdListe.SelectedItem<Stok>();
                    if (stk != null)
                    {
                        tabControl1.SelectedIndex = 0;
                        txtAdi.Text = stk.Adi;
                        txtKod.Text = stk.Kodu;
                        txtAdi.Tag = stk;
                        txtMiktar.Text = "1";
                        txtMiktar.Focus();
                        txtMiktar.SelectAll();
                    }
                }
            }
            catch (Exception ex)
            {
                ErrorMgr.Opps(ex);
            }
        }

        private void grdListe_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                try
                {
                    if (grdListe.CurrentRowIndex > -1)
                    {
                        Stok stk = grdListe.SelectedItem<Stok>();
                        if (stk != null)
                        {
                            tabControl1.SelectedIndex = 0;
                            txtAdi.Text = stk.Adi;
                            txtKod.Text = stk.Kodu;
                            txtAdi.Tag = stk;
                            txtMiktar.Text = "1";
                            txtMiktar.Focus();
                            txtMiktar.SelectAll();
                        }
                    }
                }
                catch (Exception ex)
                {
                    ErrorMgr.Opps(ex);
                }
            }
        }


        private void Ekle(Stok stk, string[] serinolar, decimal miktar)
        {
            HareketBilgileri hr = new HareketBilgileri();
            hr.BurutTutar = stk.Fiyat * miktar;
            hr.Fiyat = stk.Fiyat;
            hr.Miktar = miktar;
            if (Lines.Rows.Count > 0)
            {
                int id = ((HareketBilgileri)Lines.Rows[Lines.Rows.Count - 1]["Data"]).Id;
                hr.Id = id - 1;
            }
            else
            {
                hr.Id = -1;
            }
            hr.KdvOrani = stk.KdvOran;
            hr.KdvSira = stk.Kdv;
            hr.Satir = Lines.Rows.Count;
            hr.SeriNolar = serinolar;
            hr.SipDbcNo = 0;
            hr.SipRecNo = 0;
            hr.StokAdi = stk.Adi;
            hr.StokKodu = stk.Kodu;
            Lines.Rows.Add(stk.Adi, miktar, hr);
            grdEklenenler.Refresh();
            newScreen();
        }

        private void newScreen()
        {
            txtAdi.Text = "";
            txtKod.Text = "";
            txtMiktar.Text = "";
            txtAdi.Tag = null;
            txtMiktar.Tag = null;
            txtKod.Focus();
        }

        private void btnEkle_Click(object sender, EventArgs e)
        {
            try
            {
                if (txtMiktar.Text.NullOrNumeric())
                {
                    MiktarEkle();
                }
            }
            catch (Exception ex)
            {
                ErrorMgr.Opps(ex);
            }
        }

        private void MiktarEkle()
        {
            if (txtMiktar.Tag != null)
            {
                HareketBilgileri hr = (HareketBilgileri)grdEklenenler[Cevir.Parse<int>(txtMiktar.Tag), 2];
                hr.Miktar = Cevir.Parse<decimal>(txtMiktar.Text);
                grdEklenenler[Cevir.Parse<int>(txtMiktar.Tag), 1] = hr.Miktar;
                newScreen();
            }
            else
            {
                if (txtAdi.Tag != null)
                {
                    Stok stk = (Stok)txtAdi.Tag;
                    if (stk.Serinolu)
                    {
                        frmSerinoEkle frm = new frmSerinoEkle();
                        frm.UrunBilgisi = stk.Adi;
                        frm.Miktar = Cevir.Parse<int>(txtMiktar.Text);
                        for (int i = 0; i < grdEklenenler.RowCount; i++)
                        {
                            HareketBilgileri hr = (HareketBilgileri)grdEklenenler[i, 2];
                            if (hr.SeriNolar != null && hr.SeriNolar.Length > 0)
                            {
                                frm.EvraktakiSerinolar.AddRange(hr.SeriNolar);
                            }
                        }

                        if (frm.ShowDialog() == DialogResult.OK)
                        {
                            if (frm.SeriNolar.Length > 0)
                            {
                                txtMiktar.Text = frm.SeriNolar.Length.ToString();
                                Ekle(stk, frm.SeriNolar, Cevir.Parse<decimal>(txtMiktar.Text));
                            }
                        }
                    }
                    else
                    {
                        Ekle(stk, new string[] { }, Cevir.Parse<decimal>(txtMiktar.Text));
                    }
                    newScreen();
                }
                else
                {
                    MessageBox.Show("Lütfen ürün seçiniz !");
                }
            }
        }

        private void grdEklenenler_DoubleClick(object sender, EventArgs e)
        {
            if (grdEklenenler.CurrentRowIndex > -1)
            {
                try
                {
                    HareketBilgileri hr = (HareketBilgileri)grdEklenenler[grdEklenenler.CurrentRowIndex, 2];
                    if (hr != null)
                    {
                        txtAdi.Text = hr.StokAdi;
                        txtKod.Text = hr.StokKodu;
                        txtMiktar.Text = grdEklenenler[grdEklenenler.CurrentRowIndex, 1].ToString();
                        txtMiktar.Tag = grdEklenenler.CurrentRowIndex;
                        txtMiktar.Focus();
                    }
                }
                catch (Exception ex)
                {
                    ErrorMgr.Opps(ex);
                }
            }
        }

        private void txtMiktar_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                try
                {
                    if (txtMiktar.Text.NullOrNumeric())
                    {
                        MiktarEkle();
                    }
                }
                catch (Exception ex)
                {
                    ErrorMgr.Opps(ex);
                }
            }
        }

        private void txtKod_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (!string.IsNullOrEmpty(txtKod.Text))
                {
                    try
                    {
                        Stok stk = Database.ctor.Urunbul(txtKod.Text);
                        if (stk != null)
                        {
                            tabControl1.SelectedIndex = 0;
                            txtAdi.Text = stk.Adi;
                            txtKod.Text = stk.Kodu;
                            txtAdi.Tag = stk;
                            txtMiktar.Text = "1";
                            txtMiktar.Focus();
                            txtMiktar.SelectAll();
                        }
                        else
                        {
                            MessageBox.Show("Ürün Bulunamadı !");
                        }
                    }
                    catch (Exception ex)
                    {
                        ErrorMgr.Opps(ex);
                    }
                }
            }
        }

        private void btnCikar_Click(object sender, EventArgs e)
        {
            try
            {
                if (grdEklenenler.CurrentRowIndex > -1)
                {
                    ((DataTable)grdEklenenler.DataSource).Rows.RemoveAt(grdEklenenler.CurrentRowIndex);
                }
            }
            catch (Exception ex)
            {
                ErrorMgr.Opps(ex);
            }
        }

        private void btnKaydet_Click(object sender, EventArgs e)
        {
            try
            {
                EvrakKayit();
                this.Close();
            }
            catch (Exception ex)
            {
                ErrorMgr.Opps(ex);
            }
        }

        private void btnKlavye_Click(object sender, EventArgs e)
        {
            if (Sip.Visible)
            {
                Sip.Visible = false;
            }
            else
            {
                Sip.Visible = true;
            }
        }
    }
}